﻿using UnityEngine;
using System.Collections;

public class DefaultWorldEventReceiver : MonoBehaviour
{
	// Members

	bool		m_clockhandKill		= false;		// 시계바늘한테 죽었는지
	bool		m_clockhandAwaken	= false;		// 시계바늘을 깨웠는지 (인식당했는지)
	//bool		m_clockhandFirst	= true;			// 시계바늘 첫번째 조우 (첫번째는 무조건 등장)
	bool		m_clockhandFirst	= false;

	bool		m_finalGoal			= false;		// 마지막 골인지 여부


	/// <summary>
	/// 시계바늘 등장 랜덤 체크
	/// </summary>
	void OnCheckClockhandAppear()
	{
		if(!m_clockhandAwaken)						// * 시계바늘을 깨우지 않은 경우에만 작동
		{
			GameObject chObj	= GameObject.FindGameObjectWithTag("TheClockhand");

			if(chObj == null)
			{
				Debug.LogError("Cannot find clockhand - something's wrong here");
			}
			else
			{
				Debug.Log("clockhand found : " + chObj.name);
				ClockhandCharacter chChar	= chObj.GetComponent<ClockhandCharacter>();
				chChar.isHidden				= !(Random.Range(0, 10) < 5 || m_clockhandFirst);
				m_clockhandFirst			= false;

				Debug.Log ("clockhand check : " + chChar.isHidden);
			}
		}
	}

	/// <summary>
	/// 시계바늘 그냥 숨기기
	/// </summary>
	void OnHideClockhand()
	{
		if(m_clockhandAwaken)
			return;

		GameObject chObj	= GameObject.FindGameObjectWithTag("TheClockhand");
		
		if(chObj == null)
		{
			Debug.Log("No clockhand");
		}
		else
		{
			ClockhandCharacter chChar	= chObj.GetComponent<ClockhandCharacter>();
			chChar.isHidden				= true;
			
			Debug.Log ("clockhand is now hidden");
		}
	}

	/// <summary>
	/// 시계바늘 인식
	/// </summary>
	void OnSetClockhandAwaken()
	{
		if(!m_clockhandAwaken)
		{
			Debug.Log ("the clockhand awaken!");
			m_clockhandAwaken	= true;
			SoundManager.PlayBgm(SoundInfos.GetBgm("clockhand"));
		}
	}

	/// <summary>
	/// 일반 몹이 아니라 시계바늘이 죽였을 시 플래그 설정
	/// </summary>
	void OnSetClockhandKill()
	{
		Debug.Log ("clockhand kill");
		m_clockhandKill	= true;
	}

	/// <summary>
	/// 캐릭터가 죽었을 시
	/// </summary>
	void OnCharDie()
	{
		SoundManager.StopBgm();
		StartCoroutine(DelayAndDie());
	}

	IEnumerator DelayAndDie()
	{
		yield return new WaitForSeconds(1f);
		GameScene.RevertCodexPoint();			// 이번 판에서 얻은 코덱스 포인트 회수


		if(m_clockhandKill)						// * 시계바늘에게 죽은 경우 특수 이벤트
		{
			if(m_finalGoal)						// * 특히 마지막 골일 경우... 엔딩으로 점프
			{
				Debug.Log ("Final death");
				GameUI.lastStageClearScreen.gameObject.SetActive(true);
			}
			else
			{									// * 씬 이후 진행 초기화...
				Debug.Log ("Clockhand death");
				GameUI.clockhandScreen	= true;
				SoundManager.PlaySfx(SoundInfos.GetSfx("clockhand_death"));
			}
		}
		else
		{
			Application.LoadLevel("GameScene");	// 씬 재시작
		}
	}

	/// <summary>
	/// 텔레포트
	/// </summary>
	void OnTeleportToGoal()
	{
		GameObject dest	= GameObject.FindGameObjectWithTag("TeleportDestination");	// 목적지 찾기
		if(dest == null)
		{
			Debug.LogError("No destination!");
		}
		else
		{																			// 목적지로 텔레포트
			Vector3 destPos	= dest.transform.position;
			destPos.y		+= 8f;

			GameScene.playerCharacter.transform.position	= destPos;

			if(GameScene.stageDataToLoad == StageInfos.stage6)						// * 6스테이지일 때만 특별히 BGM 변경
			{
				SoundManager.PlayBgm(SoundInfos.GetBgm("field"));
			}
		}

		GameScene.gameCamera.followingMode	= GameCamera.FollowingMode.MapChunk;	// FIX : 텔레포트 후에는 맵 화면용으로 고정
	}

	/// <summary>
	/// 도착
	/// </summary>
	void OnGoal()
	{
		Debug.Log ("GOAL");

		GameScene.CommitCodexPoint();			// 포인트 저장

		GameScene.stageDataToLoad	= StageInfos.GetNextStage(GameScene.stageDataToLoad);	// 다음 스테이지 찾기

		Application.LoadLevel("GameScene");		// 씬 재시작 (새 스테이지로)
	}

	/// <summary>
	/// 마지막 도착
	/// </summary>
	void OnGoal_Final()
	{
		Debug.Log ("FinalGoal");
		m_finalGoal	= true;

		GameScene.CommitCodexPoint();			// 포인트 저장

		// 시계바늘 등장!

		GameObject chObj			= GameObject.FindGameObjectWithTag("TheClockhand");
		ClockhandCharacter chChar	= chObj.GetComponent<ClockhandCharacter>();
		
		chChar.isHidden				= false;
	}

	/// <summary>
	/// 엔딩
	/// </summary>
	void OnEnding()
	{
		CodexManager.clearCount++;										// 클리어카운트 증가

		GameScene.playerCharacter.gameObject.SetActive(false);			// 캐릭터 비활성화
		GameUI.epilogueScreen.gameObject.SetActive(true);				// 에필로그 화면 활성화

		SoundManager.PlayBgm(SoundInfos.GetBgm("ending"));				// BGM 변경
	}
}
